﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Aprendete.Models
{
    public partial class TutoriaAdmin
    {

        SalaRepository      salaRepo    = new SalaRepository();
        TutoriaRepository   tutoriaRepo = new TutoriaRepository();
        InscritoAdmin inscritoAdm = new InscritoAdmin();


        /// <summary>
        /// Metodo que registra una nueva tutoría en el sistema. Retorna un boolean indicando si es posible registrar esta tutoría.
        /// </summary>
        /// <param name="Tutor"></param>
        /// <param name="Fecha"></param>
        /// <returns></returns>
        public bool CrearTutoria(Usuario tutor, int materiaID, DateTime fecha, string descripcion, int usuariosMax)
        {
            Tutoria nueva = new Tutoria();

            nueva.MateriaID = materiaID;
            nueva.Descripcion = descripcion;
            nueva.Fecha = fecha;
            nueva.ProfesorID = tutor.UsuarioID;
            nueva.SalaID = SalaID();
            nueva.Realizada = false;
            nueva.UsuariosMax = usuariosMax;

            if (nueva.SalaID == -1)
            {
                return false; //No hay sala
            }

          
            try
            {                
                tutoriaRepo.Add(nueva);

                salaRepo.Usar((int)nueva.SalaID);
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Crea una tutoria sin profesor, sin sala y sin fecha, esperando a ser aceptada por un tutor.
        /// </summary>
        /// <param name="usuario"></param>
        /// <param name="materiaID"></param>
        /// <param name="fecha"></param>
        /// <param name="descripcion"></param>
        /// <returns></returns>
        public bool solicitarTutoria(Usuario usuario, int materiaID, string descripcion)
        {
            Tutoria nueva = new Tutoria();

            nueva.MateriaID = materiaID;            
            nueva.Descripcion = descripcion;
            nueva.Realizada = false;           
            nueva.Fecha = new DateTime(0,0,0);            
            
            try
            {
                tutoriaRepo.Add(nueva);

                return inscritoAdm.InscribirUsuario(usuario.UsuarioID, nueva.TutoriaID);  //puede fallar...                               
            }
            catch (Exception e)
            {
                return false;
            }
 
        }

        /// <summary>
        /// Recibe un tutoria solicitada, un tutor y una fecha. El tutor se adjudica la tutoria.
        /// </summary>
        /// <param name="tutoria"></param>
        /// <param name="tutor"></param>
        /// <param name="fecha"></param>
        /// <returns></returns>
        public bool aceptarTutoria(Tutoria tutoria,Usuario tutor, DateTime fecha, int usuariosmax)
        {            
            try
            {
                tutoriaRepo.EditTutor(tutor.UsuarioID, tutoria.TutoriaID);
                tutoriaRepo.EditFecha(fecha, tutoria.TutoriaID);
                tutoriaRepo.EditUsuariosMaximos(usuariosmax, tutoria.TutoriaID);
                int idsala = SalaID();
                tutoriaRepo.EditSala(idsala, tutoria.TutoriaID);
                salaRepo.Usar(idsala);
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        /// <summary>
        /// Marca una tutoría como realizada
        /// </summary>
        /// <param name="tutoria"></param>
        /// <returns></returns>
        public bool TutoriaRealizada(Tutoria tutoria)
        {
            try
            {
                tutoriaRepo.MarcarRealizada(tutoria.TutoriaID);
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }


        /// <summary>
        /// Retorna una lista con todas las tutorías que han sido solicitadas y que no han sido adjudicadas
        /// </summary>
        /// <returns></returns>
        public List<Tutoria> GetTutoriasSolicitadas()
        {
            return tutoriaRepo.GetTutoriasSolicitadas();
        }

        /// <summary>
        /// Retorna un string con el link para descargar el launcher para el tutor
        /// </summary>
        /// <param name="tutoria"></param>
        /// <returns></returns>
        public string LinkTutor(Tutoria tutoria)
        {
            int a = (int)tutoria.SalaID;
            string idReunion = salaRepo.GetSalaxid(2).Link;

            string rolModerador = "zQ*3>=Kxb";

            return "https://www.livemeeting.com/cc/LACCIR/join?id=" + idReunion + "&role=present&pw=" + rolModerador;
        }

        /// <summary>
        /// Retorna un string con el link para descargar el launcher para el alumno
        /// </summary>
        /// <param name="tutoria"></param>
        /// <returns></returns>
        public string LinkAlumno(Tutoria tutoria)
        {
            string idReunion = salaRepo.GetSalaxid((int)tutoria.SalaID).Link;

            string rolUsuario = "j(p2Q{_Nn";

            return "https://www.livemeeting.com/cc/LACCIR/join?id=" + idReunion + "&role=present&pw=" + rolUsuario;
        }

        /// <summary>
        /// Retorna un SalaID para una nueva tutoría.
        /// </summary>
        /// <returns></returns>
        public int SalaID()
        {
            try
            {
                return salaRepo.GetSalaLibre().SalaID;
            }
            catch 
            {
                return -1;
            }
        }


        /// <summary>
        /// Metodo que retorna todas las tutorías que cumplan con los paramétros, si no desea buscar por algún argumento se debe dejar como nulo.
        /// </summary>
        /// <param name="asignatura">valor del ID de la asignatura, igual a 0 en caso de no seleccionar ninguna</param>        
        /// <param name="dia">Si es null, se debe escribir "new DateTime(0,0,0)"</param>
        /// <returns></returns>
        /// 
        public List<Tutoria> BuscarTutoria(int curso, int asignatura, int materia, string desde, string hasta)
        {

            //get todas las tutorías que todavía no se hayan realizado
            List<Tutoria> filtradas = tutoriaRepo.TutoriasNoRealizadas();

            foreach (Tutoria t in filtradas)
            {
                //removemos las asignaturas que no coincidan con la búsqueda
                if (materia != 0)
                    if (t.MateriaID != materia)
                        filtradas.Remove(t);

               


            }
            return filtradas;

        }



        /// <summary>
        /// Retorna un SalaID para una nueva tutoría.
        /// </summary>
        /// <returns></returns>
        public bool desinscribirse(int ID, string usuario)
        {
            try
            {
               InscritoRepository ir  = new InscritoRepository();
               ir.Delete(ir.GetInscritosxnombreytuto(new UsuarioRepository().GetUsuarioxIdentity(usuario).UsuarioID,ID));
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
            
        }

    }
}